#!/bin/bash

# 测试脚本
# 用法: ./scripts/test.sh [options]

set -e  # 遇到错误立即退出

# 默认参数
BUILD_DIR="build"
VERBOSE=false
ASAN=false
FILTER=""

# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

# 打印帮助信息
print_help() {
    echo "用法: $0 [选项]"
    echo ""
    echo "选项:"
    echo "  --build-dir <dir>  指定构建目录 (默认: build)"
    echo "  --verbose, -v      显示详细输出"
    echo "  --asan             使用AddressSanitizer运行测试"
    echo "  --filter <pattern> 只运行匹配的测试"
    echo "  -h, --help         显示此帮助信息"
    echo ""
    echo "示例:"
    echo "  $0 --verbose"
    echo "  $0 --asan"
    echo "  $0 --filter ExampleTest.*"
}

# 解析命令行参数
while [[ $# -gt 0 ]]; do
    case $1 in
        --build-dir)
            BUILD_DIR="$2"
            shift 2
            ;;
        --verbose|-v)
            VERBOSE=true
            shift
            ;;
        --asan)
            ASAN=true
            shift
            ;;
        --filter)
            FILTER="$2"
            shift 2
            ;;
        -h|--help)
            print_help
            exit 0
            ;;
        *)
            echo -e "${RED}错误: 未知参数 '$1'${NC}"
            print_help
            exit 1
            ;;
    esac
done

# 获取脚本所在目录的父目录（项目根目录）
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_DIR="$(dirname "$SCRIPT_DIR")"

cd "$PROJECT_DIR"

echo -e "${GREEN}=== C++ 项目测试脚本 ===${NC}"
echo "项目目录: $PROJECT_DIR"
echo "构建目录: $BUILD_DIR"
echo ""

# 检查构建目录是否存在
if [ ! -d "$BUILD_DIR" ]; then
    echo -e "${RED}错误: 构建目录不存在: $BUILD_DIR${NC}"
    echo -e "${YELLOW}请先运行 './scripts/build.sh' 来构建项目${NC}"
    exit 1
fi

cd "$BUILD_DIR"

# 如果需要ASAN，检查是否使用ASAN构建
if [ "$ASAN" = true ]; then
    echo -e "${YELLOW}使用AddressSanitizer运行测试${NC}"
    
    # 检查是否已经使用ASAN编译
    if [ ! -f "CMakeCache.txt" ] || ! grep -q "ENABLE_ASAN:BOOL=ON" CMakeCache.txt; then
        echo -e "${YELLOW}项目未使用ASAN编译，正在重新配置...${NC}"
        cd "$PROJECT_DIR"
        ./scripts/build.sh debug --asan
        cd "$BUILD_DIR"
    fi
    
    # 设置ASAN环境变量
    export ASAN_OPTIONS=check_initialization_order=1:detect_stack_use_after_return=1:strict_string_checks=1:detect_leaks=1
fi

# 构建CTest命令
CTEST_CMD="ctest"

if [ "$VERBOSE" = true ]; then
    CTEST_CMD="$CTEST_CMD --output-on-failure --verbose"
else
    CTEST_CMD="$CTEST_CMD --output-on-failure"
fi

if [ -n "$FILTER" ]; then
    CTEST_CMD="$CTEST_CMD -R $FILTER"
fi

# 运行测试
echo -e "${GREEN}运行测试...${NC}"
eval $CTEST_CMD

# 检查测试结果
if [ $? -eq 0 ]; then
    echo -e "${GREEN}所有测试通过！${NC}"
    exit 0
else
    echo -e "${RED}测试失败！${NC}"
    exit 1
fi
